package com.ruoyi.socket.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 火币WebSocket配置类
 * 管理多个火币WebSocket地址和切换逻辑
 */
@Component
@ConfigurationProperties(prefix = "huobi.websocket")
public class HuobiWebSocketConfig {
    
    /**
     * 火币WebSocket地址列表
     */
    private List<String> urls = new ArrayList<>();
    
    /**
     * 当前使用的地址索引
     */
    private volatile int currentUrlIndex = 0;
    
    /**
     * 最大重试次数
     */
    private int maxRetries = 5;
    
    /**
     * 重连间隔（毫秒）
     */
    private long reconnectInterval = 5000;
    
    /**
     * 心跳间隔（毫秒）
     */
    private long heartbeatInterval = 20000;
    
    /**
     * 连接超时（毫秒）
     */
    private long connectionTimeout = 10000;
    
    public HuobiWebSocketConfig() {
        // 火币WebSocket地址列表 - 包含HTX新地址和火币历史地址
        
        // HTX (火币新域名) WebSocket地址
        urls.add("wss://api.htx.com/ws");
        urls.add("wss://api-aws.htx.com/ws");
        
        // 火币历史WebSocket地址 (可能仍然有效)
        urls.add("wss://api.huobi.pro/ws");
        urls.add("wss://api-aws.huobi.pro/ws");
        
        // 火币合约WebSocket地址
        urls.add("wss://api.hbdm.com/ws");
        urls.add("wss://api.hbdm.com/linear-swap-ws");
        
        // 火币其他地区地址
        urls.add("wss://api.huobi.de.com/ws");
        urls.add("wss://api.huobipro.com/ws");
        urls.add("wss://api.huobi.br.com/ws");
        urls.add("wss://api.huobi.co/ws");
        
        // 备用测试地址
        urls.add("wss://ws-api.huobi.pro/ws");
        urls.add("wss://ws-api.htx.com/ws");
    }
    
    /**
     * 获取当前使用的WebSocket地址
     */
    public String getCurrentUrl() {
        if (urls.isEmpty()) {
            return "wss://api.huobi.pro/ws";
        }
        return urls.get(currentUrlIndex);
    }
    
    /**
     * 构建完整的WebSocket URL
     */
    public String buildWebSocketUrl() {
        return getCurrentUrl();
    }
    
    /**
     * 切换到下一个地址
     */
    public String switchToNextUrl() {
        if (urls.size() <= 1) {
            return getCurrentUrl();
        }
        
        currentUrlIndex = (currentUrlIndex + 1) % urls.size();
        return getCurrentUrl();
    }
    
    /**
     * 重置到第一个地址
     */
    public void resetToFirstUrl() {
        currentUrlIndex = 0;
    }
    
    /**
     * 获取当前地址索引
     */
    public int getCurrentUrlIndex() {
        return currentUrlIndex;
    }
    
    /**
     * 获取地址总数
     */
    public int getUrlCount() {
        return urls.size();
    }
    
    /**
     * 获取下一个地址（不切换）
     */
    public String getNextUrl() {
        if (urls.size() <= 1) {
            return getCurrentUrl();
        }
        int nextIndex = (currentUrlIndex + 1) % urls.size();
        return urls.get(nextIndex);
    }
    
    /**
     * 检查是否还有其他地址可以尝试
     */
    public boolean hasMoreUrls() {
        return urls.size() > 1;
    }
    
    // Getters and Setters
    public List<String> getUrls() {
        return urls;
    }
    
    public void setUrls(List<String> urls) {
        this.urls = urls;
    }
    
    public int getMaxRetries() {
        return maxRetries;
    }
    
    public void setMaxRetries(int maxRetries) {
        this.maxRetries = maxRetries;
    }
    
    public long getReconnectInterval() {
        return reconnectInterval;
    }
    
    public void setReconnectInterval(long reconnectInterval) {
        this.reconnectInterval = reconnectInterval;
    }
    
    public long getHeartbeatInterval() {
        return heartbeatInterval;
    }
    
    public void setHeartbeatInterval(long heartbeatInterval) {
        this.heartbeatInterval = heartbeatInterval;
    }
    
    public long getConnectionTimeout() {
        return connectionTimeout;
    }
    
    public void setConnectionTimeout(long connectionTimeout) {
        this.connectionTimeout = connectionTimeout;
    }
} 